Java并发 您所在的位置:网站首页 java 条件锁 Java并发

Java并发

2024-06-29 18:53| 来源: 网络整理| 查看: 265

为什么wait()和notify()必须放在synchronized里面? 其实这已经在“操作系统——多线程同步互斥” 条件变量那一块说过。 如果A在判断part不满足条件后,此时可能由于时间片轮换造成消费者还没来得及执行wait()操作,导致wait队列中并不存在此线程,恰巧在此时切换到了某个生产者线程中,并且恰好满足了条件,发出了cond信号,此时os便在wait队列中查找等待中的线程,但是发现并没有等待线程,所以这个cond信号便丢失了,造成后面切换到消费者线程,继续执行到wait()时,已经错过了这个信号,导致消费者丢失了此次信号,处于阻塞态。 正确做法是当线程切换导致消费者来不及进入wait队列时,其它程序也不可以操作该共享变量,既保证消费者wait()和条件判断是一个原子操作,而最常见的做法便是在条件判断到wait()的这一段代码加一个互斥锁进行保护,另外生产者操作共享资源时,必须先获得锁才行。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有